1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| #include <cstdio> #include <queue> #include <algorithm> #include <cstring> #define ID(i, j) ((i) * m + (j)) const int maxn = 2e6 + 5; const int S = 1e6 + 1; const int T = 1e6 + 2; using namespace std; struct E{ int to, nxt, l, f; }e[maxn << 2]; int head[maxn], tot = 0; void addedge(int u, int v, int l){ e[++tot].to = v, e[tot].nxt = head[u], e[tot].l = l; head[u] = tot; e[tot].f = u; } priority_queue <pair<int, int> > q; int dis[maxn]; bool vis[maxn]; void Dijkstra(int S){ q.push(make_pair(0, S)); memset(vis, 0, sizeof vis); memset(dis, 0x3f, sizeof dis); dis[S] = 0; while (!q.empty()){ int cur = q.top().second; q.pop(); if (vis[cur]) continue; vis[cur] = 1; for (int i = head[cur]; i; i = e[i].nxt){ int v = e[i].to; if (dis[v] > dis[cur] + e[i].l){ dis[v] = dis[cur] + e[i].l; q.push(make_pair(-dis[v], v)); } } } } int n, m; int main(){
scanf("%d%d", &n, &m); --n, --m; if (n == 0){ int ans = 0x3f3f3f3f; for (int k, i = 0; i < m; i++){ scanf("%d", &k); ans = min(ans, k); } printf("%d\n", ans); return 0; } if (m == 0){ int ans = 0x3f3f3f3f; for (int k, i = 0; i < n; i++){ scanf("%d", &k); ans = min(ans, k); } printf("%d\n", ans); return 0; } for (int i = 0; i <= n; i++){ for (int k, j = 0; j < m; j++){ scanf("%d", &k); if (i == 0) addedge(ID(i, j) << 1, T, k); else if (i == n) addedge(S, ID(i - 1, j) << 1 | 1, k); else addedge(ID(i, j) << 1, ID(i - 1, j) << 1 | 1, k), addedge(ID(i - 1, j) << 1 | 1, ID(i, j) << 1, k); } } for (int i = 0; i < n; i++){ for (int k, j = 0; j <= m; j++){ scanf("%d", &k); if (j == 0) addedge(S, ID(i, j) << 1 | 1, k); else if (j == m) addedge(ID(i, j - 1) << 1, T, k); else addedge(ID(i, j - 1) << 1, ID(i, j) << 1 | 1, k), addedge(ID(i, j) << 1 | 1, ID(i, j - 1) << 1, k); } } for (int i = 0; i < n; i++){ for (int k, j = 0; j < m; j++){ scanf("%d", &k); addedge(ID(i, j) << 1 | 1, ID(i, j) << 1, k); addedge(ID(i, j) << 1, ID(i, j) << 1 | 1, k); } }
Dijkstra(S); printf("%d\n", dis[T]); return 0; }
|